#include "App_WaterLever.h"
#include "string.h"
#include "stdio.h"

double a;//全局变量
uint32_t b;

static void App_WaterLever_Calibrate(void)
{
    uint8_t len[1]={0};//存储到flash里数据的长度
    uint8_t data[50]={0};//a,b
    /* 1. 查看Flash中是否有存储a和b，如果有就无需做校准 */
    /*  根据数据长度判定，存储无数据全为1显示255 */
    Inf_W25Q32_Read(0,0,0,len,1);//长度存放在0扇区
    //printf("len=%d",len[0]);
    if ((len[0]>0)&&(len[0]<255))
    {
        Inf_W25Q32_Read(1,0,0,data,len[0]);//参数放在1扇区

        sscanf((char*)data,"%lf#%ld",&a,&b);//sscanf  用%.2f会报警告
        //sscanf主要用于从字符串中提取数据，按照标准 C 语言的规定，
        //它通常不支持在输入格式说明符中使用精度修饰符来限制浮点数的小数位数。
        return;
    } 
    /* 2. 校准 */
    Inf_LCD_ShowString(50,0,"Start to calibrate water level... ",34,16,BLUE,WHITE);
    Inf_LCD_ShowString(50+32*2,0,"1. Don't put into water, then press the key3....",48,16,BLUE,WHITE);
    /* 2.1 第一次按下得到b的值 */
    while (Driver_Key3_IsPress()==0);
     b=Inf_HX710_ReadValue();
    // printf("b=%ld\r\n",b);
    Inf_LCD_ShowString(50+32*2,0,"2. Put into water 10cm, then press the key3.... ",48,16,BLUE,WHITE);
    /* 2.2 第二次按下得到计算出a的值 */
    while (Driver_Key3_IsPress()==0);
    uint32_t count=Inf_HX710_ReadValue();
    a=(count-b)/10.0;
    //printf("a=%lf\r\n",a);
    /* 3. 把a和b的值以a#b的格式存储到flash里 */
    sprintf((char*)data,"%.2lf#%ld",a,b);
    //printf("data=%s\n",data);
    /* 3.1 先存储长度以方便读取 */
    len[0]=strlen((char*)data);
    Inf_W25Q32_WritePage(0,0,0,len,1);
    //printf("len=%d\n",len[0]);
    /* 3.2 再存储a#b在另一个扇区里，因为写入会擦除当前扇区数据 */
    Inf_W25Q32_WritePage(1,0,0,data,len[0]);
    
}

void App_WaterLever_Init(void)
{
    //Inf_HX710_Init();
    Inf_W25Q32_Init();
    
    App_WaterLever_Calibrate();
}


double APP_WaterLevle_GetWaterLevle(void)
{
    printf("1....");
    uint32_t y=Inf_HX710_ReadValue();
    printf("2....");
    double x=(y-b)/a;
    if (x>9999)//滤除错误
    {
        x=0;
    }
    
    return x;
}
